﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpModelInterface.h"
#include "IExternalObject.h"
#include "ElementCreationOptions.h"
#include "IVisibilityTypeFlags.h"
#include "RichTextAlignmentType.h"
#include "NdbDataSchema.h"
#include "IGraphicsStyleData.h"
#include "RichTextAnchorPointType.h"

namespace gcmp
{
    class IDocument;
    class IGraphicsElementShape;
    class IModelView;
    class IExternalDatas;

    /// \brief DrawingAnnotationTextData 注释文本数据
    ///
    /// 如需要输入多行文字，文字之间通过\n分隔开, 比如“第一行\n第二行”,若想表示字符串\n，则需输入\\n
    struct DrawingAnnotationTextData
    {
        std::wstring Text;       ///< 文本文字
        std::wstring FontPath;   ///< 文本字体路径
        Vector3d Position;       ///< 文本文字位置
        Vector3d Direction;      ///< 文本文字方向
        Vector3d Normal;         ///< 文本文字法向
        double CharHeight;       ///< 文本文字大小
        double WidthFactor;      ///< 文字宽度比例因子
    };

    /// \brief DrawingAnnotationRichTextData 富文本数据
    ///
    /// 
    struct DrawingAnnotationRichTextData
    {
        std::wstring Text;       ///< 文本文字
        std::wstring Font;       ///< 文本字体
        std::wstring BigFont;    ///< 文本大字体
        Vector3d Position;       ///< 文本文字位置
        Vector3d Direction;      ///< 文本文字方向
        double CharHeight = 3.5;        ///< 文本文字大小
        double WidthFactor = 1.0;       ///< 文字宽度比例因子
        double TextAreaWidth = 1.0;     ///< 文本区域宽度
        double TextAreaHeight = 1.0;    ///< 文本区域高度
        double CharacterSpacing = 1.0;  ///< 文本字符间距
        double LineSpaceScale = 0.5;    ///< 文本行间距比例
        bool bAutoWrap = true;          ///< 文本是否自动换行
        bool bChangeWithViewScale = false;      ///< 文字大小是否随视图比例变化
        HorizontalAlignmentType HorizontalAlignment = HorizontalAlignmentType::Left;            ///< 文本水平对齐方式
        VerticalAlignmentType VerticalAlignment = VerticalAlignmentType::Top;                   ///< 文本垂直对齐方式
        HorizontalAnchorPointType HorizontalAnchorPoint = HorizontalAnchorPointType::Left;      ///< 文本水平定位类型
        VerticalAnchorPointType VerticalAnchorPoint = VerticalAnchorPointType::Top;             ///< 文本垂直定位类型
    };

    /// \brief IDrawingAnnotationText 注释文本接口
    class GCMP_MODEL_INTERFACE_EXPORT IDrawingAnnotationText : public IExternalObject
    {
        DEFINE_CAST_DERIVED(IDrawingAnnotationText, IExternalObject);
    public:
        virtual ~IDrawingAnnotationText();

#pragma region static fuction
        /// \brief 创建文本文字(IDrawingAnnotationText)对象接口方法
        ///
        /// 通过此接口创建文本文字对象
        /// 
        /// \param pDocument   源文档
        /// \param modelViewId 创建文本文字的视图Id
        /// \param textData 文本文字数据
        /// \param eco  Element创建选项, ElementCreationOptions::Normal表示正常，ElementCreationOptions::Transient表示异常
        /// \return IDrawingAnnotationText* 文本文字对象指针接口
        static IDrawingAnnotationText* Create(IDocument* pDocument, ElementId modelViewId, const DrawingAnnotationTextData& textData,
            ElementCreationOptions eco = ElementCreationOptions::Normal);

        /// \brief 创建富文本文字
        ///
        /// 通过该方法创建的富文本文字内容为空，通过SetAcadStyleString接口设置acad样式字符串
        /// \param pDocument 文本文字所属文档
        /// \param modelViewId 创建文本文字的视图Id
        /// \param eco  Element创建选项, ElementCreationOptions::Normal表示正常，ElementCreationOptions::Transient表示临时Element
        /// \return 返回文本文字对象接口指针
        static IDrawingAnnotationText* CreateRichText(IDocument* pDocument, ElementId modelViewId, ElementCreationOptions eco = ElementCreationOptions::Normal);

        /// \brief 创建富文本文字
        ///
        /// 通过该方法创建富文本
        /// \param pDocument 文本文字所属文档
        /// \param modelViewId 创建文本文字的视图Id
        /// \param textData 富文本数据
        /// \param eco  Element创建选项, ElementCreationOptions::Normal表示正常，ElementCreationOptions::Transient表示临时Element
        /// \return 返回文本文字对象接口指针
        static IDrawingAnnotationText* CreateRichText(IDocument* pDocument, ElementId modelViewId, const DrawingAnnotationRichTextData& richTextData, ElementCreationOptions eco = ElementCreationOptions::Normal);

        /// \brief 获取Implementation Uid
        ///
        /// \return UniIdentity 返回ImplementationUid
        static UniIdentity GetImplementationUid();

#pragma endregion static fuction

#pragma region Grep related
        /// \brief 创建几何表达(IGraphicsElementShape)对象接口方法
        ///
        /// \return OwnerPtr<IGraphicsElementShape> 几何表达对象接口
        virtual OwnerPtr<IGraphicsElementShape> CreateGrep() const = 0;

#pragma endregion Grep related

#pragma region property related
        /// \brief 获得文本图形样式Id
        ///
        /// \return ElementId 文本图形样式Id
        virtual ElementId GetGraphicsStyleId() const = 0;

        /// \brief 设置文本图形样式Id
        ///
        /// 可以通过此接口设置文字的颜色
        /// 当调用对象为RichText文字时，若在SetAcadStyleString之前调用该接口，则设置的是缺省的颜色；
        /// 若在SetAcadStyleString之后调用该接口，则会重置整个文字的颜色。
        /// \param id 文本图形样式Id
        /// \return true 表示成功， false 表示失败
        virtual bool SetGraphicsStyleId(const ElementId& id) = 0;

        /// \brief 隐藏文本框
        ///
        /// \return true 表示成功, false 表示失败
        virtual bool HideBorder() = 0;

        /// \brief 显示文本框
        ///
        /// \return true 表示成功, false 表示失败
        virtual bool ShowBorder() = 0;

        /// \brief 获取文本框是否显示的状态
        ///
        /// \return true 表示文本框显示, false 表示文本框隐藏
        virtual bool IsShowBorder() const = 0;

        /// \brief 隐藏定位点
        ///
        /// \return true 表示成功, false 表示失败
        virtual bool HideAnchorPoint() = 0;

        /// \brief 显示定位点
        ///
        /// \return true 表示成功, false 表示失败
        virtual bool ShowAnchorPoint() = 0;

        /// \brief 获取定位点是否显示的状态
        ///
        /// \return true 表示定位点显示, false 表示定位点隐藏
        virtual bool IsShowAnchorPoint() const = 0;

        /// \brief 设置文字对象字符高度
        ///
        /// 当调用对象为RichText文字，若在SetAcadStyleString之前调用该接口，则设置的是缺省的高度；
        /// 若在SetAcadStyleString之后调用该接口，则会重置整个文字的高度。
        /// \param charHeight 文字对象字符高度,charHeight应为大于0的值
        /// \param pErrorMessage 错误信息
        /// \return true 表示成功, false 表示失败
        virtual bool SetCharHeight(double charHeight, std::wstring* pErrorMessage) = 0;

        /// \brief 获取文字对象字符高度
        ///
        /// 当调用对象为RichText文字,获取的是缺省的字符高度
        /// \return 文字对象字符高度
        virtual double GetCharHeight() const = 0;

        /// \brief 获取字符的宽度因子
        ///
        /// 当调用对象为RichText文字,获取的是缺省的字符高度
        /// \return 字符的宽度因子
        virtual double GetWidthFactor() const = 0;

        /// \brief 设置字符的宽度因子
        ///
        /// 当调用对象为RichText文字，若在SetAcadStyleString之前调用该接口，则设置的是缺省的宽度因子；
        /// 若在SetAcadStyleString之后调用该接口，则会重置整个文字的宽度因子。
        /// \param widthFactor 字符的宽度因子,widthFactor应为大于0的值
        /// \param pErrorMessage 错误信息
        /// \return true 表示成功, false 表示失败
        virtual bool SetWidthFactor(double widthFactor, std::wstring* pErrorMessage) = 0;

        /// \brief 设置文字大小是否随视图比例变化
        /// \param value 为true表示文字大小随视图比例变化，false表示不随视图比例变化
        /// \return 无
        virtual void SetCharSizeChangeWithViewScale(bool value) = 0;

        /// \brief 文字大小是否随视图比例变化
        ///
        /// \return true表示文字大小随视图比例变化，false表示不随视图比例变化
        virtual bool IsCharSizeChangeWithViewScale() const = 0;

        /// \biref 设置默认的字符间距
        ///
        /// 仅供RichText使用
        /// 若在SetAcadStyleString之前调用该接口，则设置的是缺省的字符间距；
        /// 若在SetAcadStyleString之后调用该接口，则会重置整个文字的字符间距。
        /// \param characterSpacing 字符间距
        /// \return ture表示设置成功，否则设置失败
        virtual bool SetCharacterSpacing(double characterSpacing) = 0;

        /// \brief 获取默认的字符间距
        ///
        /// 仅供RichText使用
        /// \return 默认的字符间距
        virtual double GetCharacterSpacing() const = 0;

        /// \brief 设置文本框定位点的世界坐标
        ///
        /// 仅供RichText使用
        /// \param position 文本框定位点的世界坐标
        /// \return true表示设置成功，否则设置失败
        virtual bool SetAnchorPosition(const Vector3d& position) = 0;

        /// \brief 获取文本框定位点的世界坐标
        ///
        /// 仅供RichText使用
        /// \return 返回文本框定位点的世界坐标
        virtual Vector3d GetAnchorPosition() const = 0;

        /// \brief 设置文本框定位点的局部坐标
        ///
        /// 仅限实现了IElementPositionReportComponent(对象位置报告组件)的RichText使用
        /// \param position 文本框定位点的局部坐标
        /// \return true表示设置成功，否则设置失败
        virtual bool SetLocalAnchorPosition(const Vector3d& position) = 0;

        /// \brief 获取文本框定位点的局部坐标
        ///
        /// 仅限实现了IElementPositionReportComponent(对象位置报告组件)的RichText使用
        /// 由定位对象的坐标系以及定位点的世界坐标计算而来
        /// \return 返回文本框定位点的局部坐标
        virtual Vector3d GetLocalAnchorPosition() const = 0;

        /// \brief 设置文本区域宽度
        ///
        /// 仅供RichText使用
        /// 设置的文本区域宽度为数据值，若随视图比例变化，显示时会作用视图比例。
        /// \param textAreaWidth 文本区域宽度
        /// \return ture表示设置成功，否则设置失败
        virtual bool SetTextAreaWidth(double textAreaWidth) = 0;

        /// \brief 获取文本区域宽度
        ///
        /// 仅供RichText使用
        /// 获取的文本区域宽度为数据值。
        /// \return 返回文本区域宽度
        virtual double GetTextAreaWidth() const = 0;

        /// \brief 设置文本区域高度
        ///
        /// 仅供RichText使用
        /// 设置的文本区域高度为数据值，若随视图比例变化，显示时会作用视图比例。
        /// \param textAreaHeight 文本区域高度
        /// \return true表示设置成功，否则设置失败
        virtual bool SetTextAreaHeight(double textAreaHeight) = 0;

        /// \brief 获取文本区域高度
        ///
        /// 仅供RichText使用
        /// 获取的文本区域高度为数据值。
        /// \return 返回文本区域高度
        virtual double GetTextAreaHeight() const = 0;

        /// \brief 设置acad样式字符串
        ///
        /// 仅供RichText使用
        /// \param acadStyleString acad样式字符串
        /// \return ture表示设置成功，否则设置失败
        virtual bool SetAcadStyleString(const std::wstring& acadStyleString) = 0;

        /// \brief 获取acad样式字符串
        ///
        /// 仅供RichText使用
        /// \return 返回acad样式字符串
        virtual std::wstring GetAcadStyleString() const = 0;

        /// \biref 设置水平对齐方式
        ///
        /// 仅供RichText使用
        /// HorizontalAlignmentType::Scatter 分散对齐在文本自动换行的情况下情况下才有效果
        /// \param horizontalAlignment 水平对齐方式(默认向左对齐)
        /// \return ture表示设置成功，否则设置失败
        virtual bool SetHorizontalAlignmentType(HorizontalAlignmentType horizontalAlignment) = 0;

        /// \brief 获取水平对齐方式
        ///
        /// 仅供RichText使用
        /// \return 返回水平对齐方式
        virtual HorizontalAlignmentType GetHorizontalAlignmentType() const = 0;

        /// \biref 设置竖直对齐方式
        ///
        /// 仅供RichText使用
        /// \param horizontalAlignment 竖直对齐方式(默认向上对齐)
        /// \return ture表示设置成功，否则设置失败
        virtual bool SetVerticalAlignmentType(VerticalAlignmentType verticalAlignment) = 0;

        /// \brief 获取竖直对齐方式
        ///
        /// \return 返回竖直对齐方式
        virtual VerticalAlignmentType GetVerticalAlignmentType() const = 0;

        /// \brief 字体加粗
        ///
        /// 仅供RichText使用
        /// 若在SetAcadStyleString之前调用该接口，则缺省为加粗
        /// 若在SetAcadStyleString之后调用该接口，则整个文字会加粗
        /// \return ture表示设置成功，否则设置失败
        virtual bool Bold() = 0;

        /// \brief 字体缺省是否加粗
        ///
        /// 仅供RichText使用
        /// \return 返回字体是否加粗
        virtual bool IsBold() const = 0;

        /// \brief 字体去加粗
        ///
        /// 仅供RichText使用
        /// 若在SetAcadStyleString之前调用该接口，则缺省为不加粗
        /// 若在SetAcadStyleString之后调用该接口，则整个文字会不加粗
        /// \return true表示设置成功，否则设置失败
        virtual bool UnBold() = 0;

        /// \brief 字体斜体
        ///
        /// 仅供RichText使用
        /// 若在SetAcadStyleString之前调用该接口，则缺省为斜体
        /// 若在SetAcadStyleString之后调用该接口，则整个文字会斜体
        /// \return true表示设置成功，否则设置失败
        virtual bool Italic() = 0;

        /// \brief 字体缺省是否斜体
        ///
        /// 仅供RichText使用
        /// \return 返回字体是否斜体
        virtual bool IsItalic() const = 0;

        /// \brief 字体去斜体
        ///
        /// 若在SetAcadStyleString之前调用该接口，则缺省为不斜体
        /// 若在SetAcadStyleString之后调用该接口，则整个文字会不斜体
        /// \return true表示去斜体成功，否则失败
        virtual bool UnItalic() = 0;

        /// \brief 字体添加下划线
        ///
        /// 仅供RichText使用
        /// 若在SetAcadStyleString之前调用该接口，不起效，因为当acad样式字符传中仅有文字时缺省就是不加下划线
        /// 若在SetAcadStyleString之后调用该接口，则整个文字会加下划线
        /// \return true表示添加成功，否则失败
        virtual bool UnderLine() = 0;

        /// \brief 字体整体是否添加下划线
        ///
        /// 仅供RichText使用
        /// \return true表示添加下划线
        virtual bool IsUnderLine() const = 0;

        /// \brief 字体去下划线
        ///
        /// 若在SetAcadStyleString之前调用该接口，不起效，因为当acad样式字符传中仅有文字时缺省就是不加下划线
        /// 若在SetAcadStyleString之后调用该接口，则整个文字会不加下划线
        /// \return true表示去下划线成功，否则失败
        virtual bool DeUnderLine() = 0;

        /// \brief 获取文字所属视图
        ///
        /// \return 返回文字所属视图
        virtual ElementId GetModelViewId() const = 0;

        /// \brief 设置文字所属视图
        ///
        /// \param modelViewId 文字所属视图的Id
        /// \return 返回true表示成功，false表示失败
        virtual bool SetModelViewId(const ElementId& modelViewId) = 0;


        /// 获取文本内容距离边框四周的边距
        ///
        /// 仅供RichText使用
        /// 获取的四个边距值均为数据值。
        /// \param topBorderMargin 上边距
        /// \param bottomBorderMargin 下边距
        /// \param leftBorderMargin 左边距
        /// \param rightBorderMargin 右边距
        /// \return void
        virtual void GetBorderMargins(double& topBorderMargin, double& bottomBorderMargin, double& leftBorderMargin, double& rightBorderMargin) const = 0;

        /// 设置文本内容距离边框四周的边距
        ///
        /// 仅供RichText使用
        /// 设置的四个边距值均为数据值，若随视图比例变化，显示时会作用视图比例。
        /// \param topBorderMargin 上边距
        /// \param bottomBorderMargin 下边距
        /// \param leftBorderMargin 左边距
        /// \param rightBorderMargin 右边距
        /// \return true表示设置成功，否则设置失败
        virtual bool SetBorderMargins(double topBorderMargin, double bottomBorderMargin, double leftBorderMargin, double rightBorderMargin) = 0;

        /// \brief 设置水平定位类型
        ///
        /// 仅供RichText使用
        /// \param horizontalAnchorPointType 水平定位类型（默认向左）
        /// \return true表示设置成功，否则设置失败
        virtual bool SetHorizontalAnchorPointType(HorizontalAnchorPointType horizontalAnchorPointType) = 0;

        /// \brief 获取水平定位类型
        ///
        /// 仅供RichText使用
        /// \return 返回水平定位类型
        virtual HorizontalAnchorPointType GetHorizontalAnchorPointType() const = 0;

        /// \brief 设置竖直定位类型
        ///
        /// 仅供RichText使用
        /// \param verticalAnchorPointType 竖直定位类型（默认向上）
        /// \return true表示设置成功，否则设置失败
        virtual bool SetVerticalAnchorPointType(VerticalAnchorPointType verticalAnchorPointType) = 0;

        /// \brief 获取竖直定位类型
        ///
        /// 仅供RichText使用
        /// \return 返回竖直定位类型
        virtual VerticalAnchorPointType GetVerticalAnchorPointType() const = 0;

        /// \brief 获取可见性标记的非const指针,用户可通过操作此返回值对可见性进行修改
        ///
        /// \return 返回可见性标记的非const指针
        virtual IVisibilityTypeFlags* GetVisibilityTypeFlagsInHostDocument() = 0;

        /// \brief 获取可见性标记的const指针
        ///
        /// \return 返回可见性标记的const指针
        virtual const IVisibilityTypeFlags* GetVisibilityTypeFlagsInHostDocument() const = 0;

        /// \brief 设置文本是否自动换行
        ///
        /// 仅供RichText使用
        /// \param isAutoWrap 是否自动换行（默认为true,文本自动换行）
        /// \return true表示设置成功，false表示设置失败
        virtual bool SetIsAutoWrap(bool isAutoWrap) = 0;

        /// \brief 获取文本是否自动换行
        ///
        /// 仅供RichText使用
        /// \return true表示文本自动换行，false表示文本不自动换行
        virtual bool IsAutoWrap() const = 0;

        /// \breif 设置行间距系数
        ///
        /// 仅供RichText使用
        /// 行间距是指上一行文字的顶部与下一行顶部之间的距离。
        /// 行间距系数是指行间距的一个倍数关系，如需要设置单倍行距时，其行间距系数为1.0。
        /// 若在SetAcadStyleString之前调用该接口，则设置的是缺省的行间距系数
        /// 若在SetAcadStyleString之后调用该接口，则会重置整个文字的行间距系数
        /// \param lineSpaceScale 待设置的行间距系数值
        /// \return true表示设置成功，否则设置失败
        virtual bool SetLineSpaceScale(double lineSpaceScale) = 0;

        /// \breif 获取行间距系数
        ///
        /// 仅供RichText使用
        /// \return 返回行间距系数
        virtual double GetLineSpaceScale() const = 0;

        /// \brief 获取文字的流向
        ///
        /// \return 返回文字的流向
        virtual gcmp::Vector3d GetDirection() const = 0;

        /// \brief 获取文字的流向
        ///
        /// 仅限实现了IElementPositionReportComponent(对象位置报告组件)的RichText使用
        /// 由定位对象的坐标系以及文字的流向计算得到的局部向量
        /// \return 返回文字流向的局部向量
        virtual Vector3d GetLocalDirection() const = 0;

        /// \brief 获取DrawingAnnotationText的所有外部扩展数据
        ///
        /// \return 返回DrawingAnnotationText的所有外部扩展数据
        virtual const IExternalDatas* GetExternalDatas() const = 0;

        /// \brief 获取DrawingAnnotationText的所有外部扩展数据，用户可以通过此返回值对外部扩展数据进行修改
        ///
        /// \return 返回DrawingAnnotationText的所有外部扩展数据
        virtual IExternalDatas* GetExternalDatas() = 0;

        /// \brief 设置是否使能背景填充
        ///
        /// \param isEnableBackgroundFill 是否使能背景填充,默认不开启
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetIsEnableBackgroundFill(bool isEnableBackgroundFill) = 0;

        /// \brief 背景填充是否开启
        ///
        /// \return 返回是否开启背景填充
        virtual bool IsEnableBackgroundFill() const = 0;

        /// \brief 设置文字对象背景填充颜色是否使用程序默认颜色
        ///
        /// \param isEnableThemeDefaultColor 是否使用程序默认颜色，默认使用程序默认颜色
        /// \return 返回true表示设置成功，否则设置失败
        virtual bool SetIsEnableThemeDefaultColor(bool isEnableThemeDefaultColor) = 0;

        /// \brief 返回文字对象背景填充颜色是否使用程序默认颜色
        ///
        /// \return 返回是否使用程序默认颜色
        virtual bool IsEnableThemeDefaultColor() const = 0;

        /// \brief 设置文字的流向
        ///
        /// \param direction 文字流向
        /// \return true 表示成功，false表示失败
        virtual bool SetDirection(const gcmp::Vector3d& direction) = 0;

        /// \brief 设置文字对象全局样式是否覆盖文字局部样式
        ///
        /// \param isUpdateLocalTextStyle 是否覆盖文字的局部样式，默认为true
        /// \return 设置成功返回true,否则返回false
        virtual bool SetIsUpdateLocalTextStyle(bool isUpdateLocalTextStyle) = 0;

        /// \brief 返回文字对象全局样式是否覆盖文字局部样式
        ///
        /// \return 返回是否覆盖文字的局部样式
        virtual bool IsUpdateLocalTextStyle() const = 0;

        /// \brief 设置字体文件名或字体名
        ///
        /// SetFont()与SetBigFont()可结对使用，SetEnglishAndChineseFont()单独使用，在使用的时候会将另一方先置空
        /// SetFont()非空时，会将GetEnglishAndChineseFont()对应的值置空
        /// 若acad样式字符串为空，则设置的是缺省的字体，若acad样式字符串非空，则会重置整个文本的字体
        /// \param fontName 字体文件名或字体名（字体文件名需带文件后缀，如simsun.ttc 、 simplex.shx）
        /// \return true表示设置成功，否则设置失败
        virtual bool SetFont(const std::wstring& fontName) = 0;

        /// \brief 获取默认的字体文件名或字体名
        ///
        /// \return 返回默认的字体文件名或字体名
        virtual std::wstring GetFont() const = 0;

        /// \brief 设置大字体文件名
        ///
        /// 仅供RichText使用
        /// 正常表示大字体时该接口设置的应该是大字体字体文件名（单线体shx，需要加文件后缀.shx），SetFont设置的应该是小字体文件名（单线体shx），例如SetBigFont(L"gbcbig.shx"); SetFont(L"simplex.shx");其中gbcbig及simplex均为文件格式为.shx的字体文件名
        /// 但是该接口不限制仅能设置大字体，也可以设置trueType、小字体（单线体shx）及其它（字体文件名需带文件后缀，如simsun.ttc 、 simplex.shx）
        /// 若acad样式字符串为空，则设置的是缺省的字体，若acad样式字符串非空，则会重置整个文本的字体（bigFontName为空时，则会采用GetFont（）的值覆盖所有字体）
        /// 大字体情况下不支持加粗、斜体
        /// SetFont()与SetBigFont()可结对使用，SetEnglishAndChineseCharFont()单独使用，在使用的时候会将另一方先置空
        /// SetBigFont()非空时，会将GetEnglishAndChineseCharFont()对应的值置空
        /// \param bigFontName 大字体文件名，默认为空(即默认为不使用大字体)
        /// \return true表示设置成功，否则设置失败
        virtual bool SetBigFont(const std::wstring& bigFontName) = 0;

        /// \brief 获取默认的大字体文件名或字体名
        ///
        /// 仅供RichText使用
        /// \return 返回默认的大字体文件名或字体名
        virtual std::wstring GetBigFont() const = 0;

        /// \brief 是否大字体优先
        /// 默认为true 大字体优先
        /// \return true 优先使用SetBigFont设置的字体，false 优先使用SetFont设置的字体
        virtual bool IsBigFontPriority() const = 0;

        /// \brief 设置是否大字体优先
        /// 当一个文字使用两个字体的情况，对应的文字字符中如果是两个字体中均有定义的字符，用户可以可通过该接口显示控制在定义上是共性的字符所使用的字体
        /// 当使用SetBigFont和SetFont设置有效字体时，IsBigFontPriority()为true 优先使用SetBigFont设置的字体，IsBigFontPriority()为false 优先使用SetFont设置的字体
        /// 当使用SetAcadStyleString设置的文字内容中同一片段可选两种字体时（标准acad字符串中大字体格式，如\F小字体，大字体；），该优先级仍然有效        
        /// \param isBigFontPriority 是否大字体优先
        /// return true 设置成功，false 设置失败
        virtual bool SetIsBigFontPriority(bool isBigFontPriority) = 0;

        /// \brief 计算文字的文本框范围
        ///
        /// 仅供RichText使用
        /// 若用户调用SetTextAreaWidth()和SetTextAreaHeight()接口设置了文本区域的宽高值，则该接口返回用户设置的文本区域
        /// 若用户未设置文本区域的宽高值，该接口会根据文字内容计算一个文本区域，需要在事务中进行。
        /// \return 返回文本区域的范围
        virtual TiltBox3d ComputeBoxAndUpdateTextArea() = 0;

        /// \brief 获取背景填充的样式Id
        ///
        /// 仅RichText下有效
        /// 若用户没有设置，平台提供默认的背景填充样式Id,所有文字共用同一个样式Id
        /// \return 返回背景填充的样式Id
        virtual ElementId GetBackgroundFillStyleElementId() const = 0;

        /// \brief 设置背景填充的样式Id
        ///
        /// 仅RichText下有效
        /// 若用户没有设置，平台提供默认的背景填充样式Id,所有文字共用同一个样式Id
        /// \param styleId 背景填充的样式Id
        /// \return 设置成功返回true，否则返回false
        virtual bool SetBackgroundFillStyleElementId(ElementId backgroundFillStyleElementId) = 0;

        /// \brief  获得是否需要文字默认留白（默认为true(需要留白)）
        ///
        /// 默认留白包含：1. 每行文字最后一个字符右边字符留白及字符间距系数导致的留白
        ///               2. 最后一行后的行间隙及行间距系数导致的留白
        ///return true 需要默认留白，false不需要默认留白
        virtual bool IsNeedDefaultBlank() const = 0;

        /// \brief  设置是否需要文字默认留白
        /// 
        /// 默认留白包含：1. 每行文字最后一个字符右边字符留白及字符间距系数导致的留白
        ///               2. 最后一行后的行间隙及行间距系数导致的留白
        /// \param isNeedDefaultBlank 是否需要默认留白，默认为true（需要留白）
        ///return true 设置成功，false设置失败
        virtual bool SetIsNeedDefaultBlank(bool isNeedDefaultBlank) = 0;

        /// \brief 设置中西文字体(文件)名
        /// 
        /// 接口用来对中西文字符分别设置字体
        /// 现有SetFont()与SetBigFont()设置字体接口可成对使用，该接口单独使用；使用时会将另一方置空
        /// 中西文字体一方不为空时会将GetFont()、GetBigFont()的值置空，且设置后中英文字体会作用到文本字符串的序列化
        /// \param eFontName 西文字体名，默认为空 (字体文件名需带文件后缀，如simsun.ttc)
        /// \param cFontName 中文字体名，默认为空 (字体文件名需带文件后缀，如simsun.ttc)
        /// \return true 设置成功, false 设置失败
        virtual bool SetEnglishAndChineseFont(const std::wstring& enFont, const std::wstring& zhFont) = 0;

        /// \brief 获取中英文字体(文件)名
        /// 
        /// \return 返回中英文字体(文件)名，pair中first为西文字体名，second为中文字体名
        virtual std::pair<std::wstring, std::wstring> GetEnglishAndChineseFont() const = 0;

        /// \brief 设置变换是否调整文字可读性
        /// 
        /// \param adjustReadability true表示调整可读性，false表示不调整可读性（纯几何矩阵变化），默认为true
        /// \return true表示设置成功，否则设置失败
        virtual bool SetIsTransformAdjustReadability(bool adjustReadability) = 0;

        /// \brief 获取变换是否调整文字可读性
        /// 
        /// \return true表示调整可读性，false表示不调整可读性（纯几何矩阵变化）
        virtual bool IsTransformAdjustReadability() const = 0;

        /// \brief 设置是否可以被选择
        /// 
        /// \param isSelectable true-可以被选择；false-不可以被选择
        /// \return true 设置成功，false设置失败
        virtual bool SetIsSelectable(bool isSelectable) = 0;

        /// \brief 获取是否可以被选择
        /// 
        /// \return true-可以被选择；false-不可以被选择
        virtual bool IsSelectable() const = 0;

        /// \brief 获取可见性标记
        /// 
        /// \return 标记值
        GCMP_OBSOLETE_API(2020/09/01, IDrawingAnnotationText::GetVisibilityTypeFlagsInHostDocument() const) virtual UInt32 GetVisibilityInHostDocument() const = 0;

        /// \brief 设置可见性标记
        /// 
        /// \param flag 标记值
        GCMP_DEPRECATED_API(2020/09/01) virtual bool SetVisibilityInHostDocument(UInt32 flag) = 0;

        /// \brief 设置字体文件名
        ///
        /// 目前字体文件需要放在运行程序目录下
        /// 若为RichText在SetAcadStyleString之前调用该接口，则设置的是缺省的字体
        /// 若为RichText在SetAcadStyleString之后调用该接口，则会重置整个文字的字体
        /// \param fontFileName 若RichText则应该设置字体文件名，若非RichText则应设置字体文件路径
        /// \return true表示设置成功，否则设置失败
        GCMP_OBSOLETE_API(2021/05/01, IDrawingAnnotationText::SetFont(const std::wstring& fontName)) virtual bool SetFontFileName(const std::wstring& fontFileName) = 0;

        /// \brief 获取默认的字体文件名
        ///
        /// 仅供RichText使用
        /// \return 返回默认的文字字体
        GCMP_OBSOLETE_API(2021/05/01, IDrawingAnnotationText::GetFont() const) virtual std::wstring GetFontFileName() const = 0;

        /// \brief 设置背景填充的颜色
        ///
        /// \param backgroundFillColor 背景填充的颜色，默认为Color(255, 255, 255)
        /// \return 返回true表示设置成功，否则设置失败
        GCMP_OBSOLETE_API(2022/07/01, IDrawingAnnotationText::SetBackgroundFillStyleElementId(ElementId backgroundFillStyleElementId)) virtual bool SetBackgroundFillColor(const gcmp::Color& backgroundFillColor) = 0;

        /// \brief 获取背景填充的颜色
        ///
        /// \return 返回背景填充的颜色
        GCMP_OBSOLETE_API(2022 / 07 / 01, IDrawingAnnotationText::GetBackgroundFillStyleElementId() const) virtual gcmp::Color GetBackgroundFillColor() const = 0;

        /// \brief 设置背景填充是否透明
        ///
        /// \param isBackgroundFillTransparency 背景填充是否透明,默认透明
        /// \return 设置成功返回true,否则返回false
        GCMP_OBSOLETE_API(2022 / 07 / 01, IDrawingAnnotationText::SetBackgroundFillStyleElementId(ElementId backgroundFillStyleElementId)) virtual bool SetIsBackgroundFillTransparency(bool isBackgroundFillTransparency) = 0;

        /// \brief 背景填充是否透明
        ///
        /// \return 返回背景填充是否透明
        GCMP_OBSOLETE_API(2022 / 07 / 01, IDrawingAnnotationText::GetBackgroundFillStyleElementId() const) virtual bool IsBackgroundFillTransparency() const = 0;

        /// \brief 设置背景填充智能颜色模式
        ///
        /// \param SmartColorMode 智能颜色模式
        /// \return 设置成功返回true,否则返回false
        GCMP_OBSOLETE_API(2022 / 07 / 01, IDrawingAnnotationText::SetBackgroundFillStyleElementId(ElementId backgroundFillStyleElementId)) virtual bool SetBackgroundFillSmartColorMode(const gcmp::SmartColorMode & smartColorMode) = 0;

        /// \brief 获取背景填充智能颜色模式
        ///
        /// \return 返回背景填充智能颜色模式
        GCMP_OBSOLETE_API(2022 / 07 / 01, IDrawingAnnotationText::GetBackgroundFillStyleElementId() const) virtual gcmp::SmartColorMode GetBackgroundFillSmartColorMode() const = 0;
#pragma endregion property related
    };
}
